package com.zzh.lib.locker;

import android.content.Context;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.biometric.BiometricManager;
import androidx.biometric.BiometricPrompt;
import androidx.fragment.app.FragmentActivity;

/**
 * Created by ZZH on 2022/2/9.
 *
 * @Date: 2022/2/9
 * @Email: zzh_hz@126.com
 * @QQ: 1299234582
 * @Author: zzh
 * @Description: Main 初始化
 */
public class HLocker {

    private static Context mContext;

    public static void init(Context ctx) {
        mContext = ctx;
    }

    public static void checkNull() {
        if (mContext == null) {
            throw new NullPointerException("must be invoke Locker.init(Context)");
        }
    }

    static HLocker mInstance;

    public static HLocker getInstance() {
        if (mInstance == null) {
            synchronized (HLocker.class) {
                if (mInstance == null) {
                    mInstance = new HLocker();
                    return mInstance;
                }
            }
        }
        return mInstance;
    }

    /**
     * 是否支持生物识别。
     * <p>
     * BIOMETRIC_SUCCESS 0：设备可以使用生物特征认证。
     * <p>
     * BIOMETRIC_STATUS_UNKNOWN -1
     * <p>
     * BIOMETRIC_ERROR_UNSUPPORTED = -2
     * <p>
     * BIOMETRIC_ERROR_NO_HARDWARE 12 ：此设备上没有生物特征。用户无法进行身份验证，因为没有合适的硬件（例如：没有生物识别传感器或没有键盘保护）
     * <p>
     * <p>
     * BIOMETRIC_ERROR_HW_UNAVAILABLE 1 ：设备中当前不提供生物识别功能。
     * <p>
     * <p>
     * BIOMETRIC_ERROR_NONE_ENROLLED 11 ：用户尚未在设备中关联任何生物特征凭证。
     * <p>
     * BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED 15 ：用户无法进行身份验证，因为已发现一个或者多个硬件传感器存在安全漏洞。咋安全更新解决问题之前，受影响的传感器不可用
     *
     * @return true 支持
     */
    public static boolean isBiometric() {
        BiometricManager from = BiometricManager.from(mContext);
        int canAuthenticate = from.canAuthenticate();
        Log.d("---", "---: " + canAuthenticate);
        return canAuthenticate == BiometricManager.BIOMETRIC_SUCCESS || canAuthenticate == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED;
    }

    /**
     * 完整支持，即：硬件设备支持，并且用户已经设置了生物识别
     *
     * @return true 设置了
     */
    public static boolean isBiometricWhole() {
        BiometricManager from = BiometricManager.from(mContext);
        int canAuthenticate = from.canAuthenticate();
        Log.d("---", "---: " + canAuthenticate);
        return canAuthenticate == BiometricManager.BIOMETRIC_SUCCESS;
    }


    /**
     * 进行认证
     *
     * @param fa 当前页面
     */
    public void authenticate(FragmentActivity fa) {
        BiometricPrompt bp = new BiometricPrompt(fa, new BiometricPrompt.AuthenticationCallback() {
            @Override
            public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
                super.onAuthenticationError(errorCode, errString);
            }

            @Override
            public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
            }

            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
            }
        });
        BiometricPrompt.PromptInfo info = new BiometricPrompt.PromptInfo.Builder().setTitle("指纹认证")
                .setSubtitle("请进行指纹校验").setNegativeButtonText("取消")
                .setDescription("指纹校验通过后方可进行下一步操作").build();
        bp.authenticate(info);

    }
}
